#include<iostream>
#include "../source/public.h"
using namespace std;

/*
telnet www.baidu.com 80
Trying 182.61.200.6...
Connected to www.a.shifen.com.
Escape character is '^]'.
GET / HTTP/1.1
host: www.baidu.com

这是一个HTTP请求和响应的例子

**请求部分**：
1. `GET / HTTP/1.1`：这是请求行，包括HTTP方法（这里是GET），请求的资源（这里是/，表示主页），和HTTP版本（这里是1.1）。
2. `host: www.baidu.com`：这是一个请求头，指定了请求的主机名。

*/
const char test_request_data[] = "POST / HTTP/1.1\r\n"
                                 "Host: www.baidu.top\r\n"
                                 "Content-Length: 10\r\n\r\n"
                                 "1234567890";

void test_request()
{
    std::string tmp = test_request_data;
    framework::http::HttpRequestParser parser;
    size_t s = parser.execute(&tmp[0], tmp.size());
    std::cout << "execute rt = " << s
              << "\nhas_error = " << parser.hasError()
              << "\ntotal = " << tmp.size()
              << "\nContent-Length = " << parser.getContentLength() << std::endl;
    // std::cout << "body = " << parser.getData()->getBody() << std::endl;
    tmp.resize(tmp.size() - s);

    std::cout << "--------------------------------" << std::endl;
    std::cout << parser.getData()->toString();
    std::cout << "--------------------------------" << std::endl;
    std::cout << "body: " << tmp << std::endl;
}

/*
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 9508
Content-Type: text/html
Date: Fri, 27 Oct 2023 08:11:45 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
...

**响应部分**：
1. `HTTP/1.1 200 OK`：这是状态行，包括HTTP版本（这里是1.1），状态码（这里是200，表示请求成功），和状态文本（这里是OK）。
2. `Accept-Ranges: bytes`：这是一个响应头，表示服务器接受字节范围的请求。
3. `Cache-Control: no-cache`：这个响应头表示不应缓存响应的数据。
4. `Connection: keep-alive`：这个响应头表示连接应保持打开，以便进行后续的请求。
5. `Content-Length: 9508`：这个响应头表示响应体的长度（以字节为单位）。
6. `Content-Type: text/html`：这个响应头表示响应体的媒体类型（这里是text/html）。
7. `Date: Fri, 27 Oct 2023 08:11:45 GMT`：这个响应头表示消息被发送的日期和时间。
8. `P3p: CP=" OTI DSP COR IVA OUR IND COM "`：这个响应头用于定义网站的隐私策略。
9. `Pragma: no-cache`：这个响应头用于兼容HTTP/1.0中的缓存指令。
...
*/
const char test_response_data[] = "HTTP/1.1 200 OK\r\n"
        "Date: Tue, 04 Jun 2019 15:43:56 GMT\r\n"
        "Server: Apache\r\n"
        "Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT\r\n"
        "ETag: \"51-47cf7e6ee8400\"\r\n"
        "Accept-Ranges: bytes\r\n"
        "Content-Length: 81\r\n"
        "Cache-Control: max-age=86400\r\n"
        "Expires: Wed, 05 Jun 2019 15:43:56 GMT\r\n"
        "Connection: Close\r\n"
        "Content-Type: text/html\r\n\r\n"
        "<html>\r\n"
        "<meta http-equiv=\"refresh\" content=\"0;url=http://www.baidu.com/\">\r\n"
        "</html>\r\n";

void test_reaponse()
{
    framework::http::HttpResponseParser parser;
    std::string tmp = test_response_data;
    size_t s = parser.execute(&tmp[0], tmp.size(), true);
    std::cout << "execute rt = " << s
              << " has_error=" << parser.hasError()
              << " is_finished=" << parser.isFinished()
              << " total=" << tmp.size()
              << " content_length=" << parser.getContentLength()
              << " tmp[s]=" << tmp[s] << std::endl;

    tmp.resize(tmp.size() - s);

    std::cout << "--------------------------------" << std::endl;
    std::cout << parser.getData()->toString();
    std::cout << "--------------------------------" << std::endl;
    std::cout << "body: " << tmp << std::endl;
}


int main(void)
{
    // test_request();
    test_reaponse();
    return 0;
}